﻿using DEMO.Y2015CS58.LIB;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DEMO.Y2015CS58.UI
{
    public partial class frmDemoDBSinhVien : Form
    {
        string connetionString = @"Data Source=D630;Initial Catalog=IMIC_TEST;Persist Security Info=True;User ID=sa;Password=123456";
        int iD;

        string mod; // MAD: Thêm; MED: Sửa, MDE: Xóa

        public frmDemoDBSinhVien()
        {
            InitializeComponent();
            btnAdd.Enabled = false;
            btnDelete.Enabled = false;
            btnEdit.Enabled = false;
            btnSave.Enabled = false;
            btnShowData.Enabled = false;
            groupBox1.Enabled = false;


            //Nạp dữ liệu cho combobox LỚp
            Lop_BLL lop_BLL = new Lop_BLL();

            DataTable dt = new DataTable();
            dt = lop_BLL.Lop_GetAll();

            cboLop.DataSource = dt;
            cboLop.DisplayMember = "Lop_Ma";
            cboLop.ValueMember = "Lop_ID";

        }

        private bool CheckConnection()
        {
            try
            {
                SqlConnection conn;
                conn = new SqlConnection(connetionString);
                conn.Open();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        private DataTable LoadCustomer()
        {
            try
            {
                SqlConnection conn;
                conn = new SqlConnection(connetionString);
                conn.Open();
                String sql = "SELECT s.*, l.Lop_Ma FROM SinhVien s INNER JOIN LOP l ON s.LopID = l.Lop_ID";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                conn.Close();
                return dt;
            }
            catch
            {
                return null;
            }
        }
        private bool InsertCustomer(string sMaSV, string sTenSV, string sDiaChi, DateTime dNgaySinh, bool bGioiTinh)
        {
            try
            {
                SqlConnection conn;
                conn = new SqlConnection(connetionString);
                String sqlcmd = String.Format("insert into  SINHVIEN  values ('{0}',N'{1}',N'{2}','{3}', {4}) Select @@IDENTITY ", sMaSV, sTenSV, sDiaChi, dNgaySinh, Convert.ToInt32(bGioiTinh));// câu lệnh insert cần thực hiện
                SqlCommand cmd = new SqlCommand(sqlcmd, conn);
                conn.Open();
                iD = Convert.ToInt32(cmd.ExecuteScalar());
                conn.Close();
                if (iD > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

        private bool UpdateCustomer(int iD, string sTenSV, string sDiaChi, DateTime dNgaySinh, bool bGioiTinh)
        {
            try
            {
                SqlConnection conn;
                conn = new SqlConnection(connetionString);
                String sqlcmd = String.Format("Update  SINHVIEN set TenSV=N'{0}',DiaChi=N'{1}',NgaySinh='{2}', GioiTinh = {3}  WHERE ID = '{4}'", sTenSV, sDiaChi, dtpNgaySinh, bGioiTinh, iD);
                SqlCommand cmd = new SqlCommand(sqlcmd, conn);
                cmd.Connection.Open();
                int effRows = cmd.ExecuteNonQuery();
                conn.Close();
                if (effRows > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
        private bool DeleteCustomer(int iD)
        {
            try
            {
                SqlConnection conn;
                conn = new SqlConnection(connetionString);
                String sqlcmd = String.Format("DELETE SINHVIEN WHERE ID={0}", iD.ToString());
                SqlCommand cmd = new SqlCommand(sqlcmd, conn);
                cmd.Connection.Open();
                int effRows = cmd.ExecuteNonQuery();
                conn.Close();
                if (effRows > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }

        private void btnTestConnection_Click(object sender, EventArgs e)
        {
            btnAdd.Enabled = false;
            btnDelete.Enabled = false;
            btnEdit.Enabled = false;
            btnSave.Enabled = false;
            groupBox1.Enabled = false;

            if (CheckConnection())
            {
                MessageBox.Show("Kết nối cơ sở dữ liệu thành công.");
                btnShowData.Enabled = true;
            }
            else
            {
                btnShowData.Enabled = false;
                MessageBox.Show("Kết nối cơ sở dữ liệu thất bại.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnShowData_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt = LoadCustomer();
            dt.Columns.Add("GioiTinhIsText");

            foreach (DataRow item in dt.Rows)
            {
                if (Convert.ToBoolean(item["SinhVien_GioiTinh"]))
                    item["GioiTinhIsText"] = "Nam";
                else
                    item["GioiTinhIsText"] = "Nữ";
            }

            dataGridView1.DataSource = dt;
            dataGridView1.Columns["SinhVien_GioiTinh"].Visible = false;

            dataGridView1.Columns["SinhVien_Ma"].HeaderText = "Mã SV";
            dataGridView1.Columns["SinhVien_Ten"].HeaderText = "Tên SV";
            dataGridView1.Columns["SinhVien_DiaChi"].HeaderText = "Địa chỉ";
            dataGridView1.Columns["SinhVien_NgaySinh"].HeaderText = "Ngày sinh";
            dataGridView1.Columns["GioiTinhIsText"].HeaderText = "Giới tính";

            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

            btnAdd.Enabled = true;
            if (dataGridView1.Rows.Count > 0)
            {
                btnDelete.Enabled = true;
                btnEdit.Enabled = true;
            }
            else
            {
                btnDelete.Enabled = false;
                btnEdit.Enabled = false;
            }
            btnSave.Enabled = false;
            groupBox1.Enabled = false;


        }
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count > 0 || dataGridView1.SelectedCells.Count > 0)
            {
                btnAdd.Enabled = true;
                btnDelete.Enabled = true;
                btnEdit.Enabled = true;
                btnSave.Enabled = false;
                groupBox1.Enabled = false;

                int rowIndex = dataGridView1.SelectedCells[0].RowIndex;

                iD = Convert.ToInt32(dataGridView1.Rows[rowIndex].Cells["SinhVien_ID"].Value);
                txtMaSV.Text = dataGridView1.Rows[rowIndex].Cells["SinhVien_Ma"].Value.ToString();
                txtTenSV.Text = dataGridView1.Rows[rowIndex].Cells["SinhVien_Ten"].Value.ToString();
                txtDiaChi.Text = dataGridView1.Rows[rowIndex].Cells["SinhVien_DiaChi"].Value.ToString();
                dtpNgaySinh.Value = Convert.ToDateTime(dataGridView1.Rows[rowIndex].Cells["SinhVien_NgaySinh"].Value);
                rdnNam.Checked = Convert.ToBoolean(dataGridView1.Rows[rowIndex].Cells["SinhVien_GioiTinh"].Value);
                txtID.Text = iD.ToString();
            }
        }

        private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            //if (dataGridView1.RowCount > 0)
            //{
            //    btnAdd.Enabled = true;
            //    btnDelete.Enabled = true;
            //    btnEdit.Enabled = true;
            //    btnSave.Enabled = false;
            //    groupBox1.Enabled = false;

            //    txtMaKH.Text = dataGridView1.Rows[e.RowIndex].Cells["MaKH"].Value.ToString();
            //    txtTenKH.Text = dataGridView1.Rows[e.RowIndex].Cells["TenKH"].Value.ToString();
            //    txtSoTK.Text = dataGridView1.Rows[e.RowIndex].Cells["SoTK"].Value.ToString();
            //    txtDiaChi.Text = dataGridView1.Rows[e.RowIndex].Cells["DiaChi"].Value.ToString();
            //}
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            //ẩn các control trước, sửa sau
            btnAdd.Enabled = false;
            btnDelete.Enabled = false;
            btnEdit.Enabled = false;
            btnSave.Enabled = true;
            groupBox1.Enabled = true;

            txtMaSV.Clear();
            txtDiaChi.Clear();
            txtTenSV.Clear();
            txtDiaChi.Clear();
            txtMaSV.Focus();
            txtMaSV.Enabled = true;

            mod = "MAD";
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            //ẩn các control trước, sửa sau
            btnAdd.Enabled = false;
            btnDelete.Enabled = false;
            btnEdit.Enabled = false;
            btnSave.Enabled = true;
            groupBox1.Enabled = true;

            txtMaSV.Enabled = false;
            txtTenSV.Focus();

            mod = "MED";
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            mod = "MDE";
            //Xóa trước, ẩn các control sau
            if (MessageBox.Show("Bạn có chắc chắn xóa?", "Câu hỏi", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                //if (DeleteCustomer(iD))

                SinhVien_BLL sinhVien_Bll = new SinhVien_BLL();
                if(sinhVien_Bll.SinhVien_Delte(iD))
                    MessageBox.Show("Xóa sinh viên thành công");
                else
                    MessageBox.Show("Xóa sinh viên thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                btnShowData.PerformClick();
            }
            btnAdd.Enabled = true;
            btnDelete.Enabled = true;
            btnEdit.Enabled = true;
            btnSave.Enabled = false;
            groupBox1.Enabled = false;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            SinhVien_BLL sinhVien_Bll = new SinhVien_BLL();
            SinhVien_Info sinhVien_Info = new SinhVien_Info();
            sinhVien_Info.SinhVien_ID = 0;
            sinhVien_Info.SinhVien_Ma = txtMaSV.Text;
            sinhVien_Info.SinhVien_Ten = txtTenSV.Text;
            sinhVien_Info.SinhVien_DiaChi = txtDiaChi.Text;
            sinhVien_Info.SinhVien_GioiTinh = rdnNam.Checked;
            sinhVien_Info.SinhVien_NgaySinh = dtpNgaySinh.Value;
            sinhVien_Info.LopID = Convert.ToInt32(cboLop.SelectedValue);

            //Lưu trước, ẩn các control sau
            if (mod == "MAD")
            {
                //Insert
                //if (InsertCustomer(txtMaSV.Text, txtTenSV.Text, txtDiaChi.Text, dtpNgaySinh.Value, rdnNam.Checked))


                if (sinhVien_Bll.SinhVien_Add(sinhVien_Info))
                {
                    btnShowData.PerformClick();
                    MessageBox.Show("Thêm sinh viên thành công");
                }
                else
                    MessageBox.Show("Thêm sinh viên thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (mod == "MED")
            {
                //Update

                //if (UpdateCustomer(iD, txtTenSV.Text, txtDiaChi.Text, dtpNgaySinh.Value, rdnNam.Checked))

                if (sinhVien_Bll.SinhVien_Update(sinhVien_Info))
                {
                    btnShowData.PerformClick();
                    MessageBox.Show("Sửa sinh viên thành công");
                }
                else
                    MessageBox.Show("Sửa sinh viên thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                //nothing
            }



            btnAdd.Enabled = true;
            btnDelete.Enabled = true;
            btnEdit.Enabled = true;
            btnSave.Enabled = false;
            groupBox1.Enabled = false;
        }



    }
}

/*
 Mô hình 1 lớp như trên trên gặp phải những lỗi sau đâu:
- Không tận dụng được lại code, như bạn thấy có những dòng khai báo và thao tác thực hiện lập lại rất nhiều lần. 
- Chưa tách các dữ liệu thông tin server ra file config
- Thực hiện theo mô hình 1 lớp rất khó bảo trì
Trong "Mô hình 3 lớp trong C#" chúng ta sẽ cải tiến những thiếu sót trên.
 */